package com.ruoyi.web.controller.example;


import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.BizException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.FileSystem;

@Anonymous
@Api(tags = "文件管理相关内容")
@RestController
public class FileController {

    //定义好文件上传路径
    @Value("${ruoyi.profile}")
    private String UPLOAD_PATH;

    @ApiOperation(value = "文件上传")
    @PostMapping("/FileUpload")
    //文件上传相关方法
    public AjaxResult FileUpload(@RequestPart("myFile") MultipartFile file){

        //第一步判断文件是否为空
        //如何判断
        if (file.isEmpty()){
            return AjaxResult.error(500,"上传的文件为空");
        }
        //第1.5步，判断文件大小，在application.yml中已经判断好了

        //第二部，获取文件的名称，进行文件类型判断
        //假如上传的图片叫 abc.jpg 那么FileName 此时就等于"abc.jpg"，格式为字符串
        String FileName = file.getOriginalFilename();

        System.out.println("上传的文件名称是："+ FileName);
        //第三步，判断文件的类型是否符合需求，比如我们只想获取图片类型
        //先定义好，我们接受那些类型，例如常见的图片类型有：jpg，jpeg，png
        //获取我们文件的后缀名，判断是否在我们的需求范围内即可
        //字符串的分割，通过“.” 来吧文件名称进行分割，获取到后缀
        String[] arrs = FileName.split("\\.");

        System.out.println("数组的长度是：" + arrs.length);

        //获取文件后缀 abc.jpg 变成了arrs= [abc.jpg]
        // 数组下标是从0开始的,想要获取最后一位，其实获取的是，数组的长度-1
        String suffix = arrs[arrs.length-1];

        suffix = suffix.toLowerCase();//大写转换小写的方法

        if (!suffix.equals("jpg") && !suffix.equals("jpeg") && !suffix.equals("png")){
            return AjaxResult.error(500,"只能上传jpg,jpeg,png格式的文件");
        }

        File path = new File(UPLOAD_PATH);
        //如果路径不存在，就创建一个
        //这里如果你定义的路径在C盘，可能存在创建不成功的情况
        if(!path.exists()){
            path.mkdir();
        }

        File dest = new File(UPLOAD_PATH + "/" + FileName);
        try {
            file.transferTo(dest);
        } catch (IOException e) {
            System.out.println("失败了，原因是："+ e.getMessage());
            throw new BizException(500,"文件保存失败");
        }

        return AjaxResult.success("传输成功");
    }

    //文件下载相关方法
    @GetMapping("/Download")
    @ApiOperation(value = "文件下载")
    public ResponseEntity<InputStreamResource> Download(@RequestParam("name") String name) {
        FileSystemResource file = new FileSystemResource(UPLOAD_PATH + "/" +name);

        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-control","no-cache,no-store,must-revalidate");
        headers.add("Content-Dispositon",String.format("attachment;filename=\"%s\"",file.getFilename()));
        headers.add("Program","no-cache");
        headers.add("Expires","0");
    //固定写法
        try{
            return ResponseEntity
                    .ok()
                    .headers(headers)
                    .contentLength(file.contentLength())
                    .contentType(MediaType.parseMediaType("application/octet-stream"))
                    .body(new InputStreamResource(file.getInputStream()));
        }catch (IOException e) {
            throw new BizException(500,"文件下载失败");
        }
    }

}
